import org.attoparser.util.TextUtil;
import org.thymeleaf.util.TextUtils;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

public class UniqueMorseAlgorithm {

    /**
     * 国际摩尔斯密码定义一种标准编码方式，将每个字母对应于一个由一系列点和短线组成的字符串， 比如: "a" 对应 ".-", "b" 对应 "-...", "c" 对应 "-.-.", 等等。
     * <p>
     * 为了方便，所有26个英文字母对应摩尔斯密码表如下：
     * <p>
     * [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
     * 给定一个单词列表，每个单词可以写成每个字母对应摩尔斯密码的组合。例如，"cab" 可以写成 "-.-..--..."，(即 "-.-." + "-..." + ".-"字符串的结合)。我们将这样一个连接过程称作单词翻译。
     * <p>
     * 返回我们可以获得所有词不同单词翻译的数量。
     * <p>
     * 例如:
     * 输入: words = ["gin", "zen", "gig", "msg"]
     * 输出: 2
     * 解释:
     * 各单词翻译如下:
     * "gin" -> "--...-."
     * "zen" -> "--...-."
     * "gig" -> "--...--."
     * "msg" -> "--...--."
     * <p>
     * 共有 2 种不同翻译, "--...-." 和 "--...--.".
     *  
     * <p>
     * 注意:
     * <p>
     * 单词列表words 的长度不会超过 100。
     * 每个单词 words[i]的长度范围为 [1, 12]。
     * 每个单词 words[i]只包含小写字母。
     * <p>
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode-cn.com/problems/unique-morse-code-words
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     */

    private String[] morse = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};

    public static void main(String[] args) {
        UniqueMorseAlgorithm uniqueMorseAlgorithm = new UniqueMorseAlgorithm();
        String[] words = {"gin", "zen", "gig", "msg"};
        int morseRepresentations = uniqueMorseAlgorithm.uniqueMorseRepresentations(words);
        System.out.println("输出:" + morseRepresentations);
    }

    private int uniqueMorseRepresentations(String[] words) {
        HashSet<String> hashSet = new HashSet<>(words.length/2);
        for (String word : words) {
            String morseCode = toMorseCode(morse, word);
            hashSet.add(morseCode);
        }
        return hashSet.size();
    }

    private String toMorseCode(String[] codebook, String text) {
        StringBuilder buf = new StringBuilder(text.length() * 3);
        for (char c : text.toLowerCase().toCharArray()) {
            buf.append(codebook[c - 97]);
        }
        return buf.toString();
    }

}
